package cn.bearspark.article.provider.dao.mapper;

import cn.bearspark.article.provider.dao.po.draft.DraftBasePO;
import cn.bearspark.article.provider.dao.po.draft.DraftPO;
import cn.bearspark.article.provider.dao.po.draft.DraftSimplePO;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 专栏草稿的数据映射接口
 *
 * @author f
 */
@Mapper
public interface DraftMapper {

    /**
     * 新增草稿的基础数据
     *
     * @param draftBasePO 草稿的数据
     */
    @Insert("INSERT INTO t_draft_base (draft_id, user_id, title) " +
            "VALUES (#{draftId}, #{userId}, #{title})")
    void insertBase(DraftBasePO draftBasePO);

    /**
     * 新增草稿的内容数据
     *
     * @param draftId 草稿 id
     * @param content 草稿内容
     */
    @Insert("INSERT INTO t_draft_content (draft_id, content) " +
            "VALUES (#{draftId}, #{content})")
    void insertContent(long draftId, String content);

    /**
     * 更新草稿的基础数据
     *
     * @param draftBasePO 待更新的草稿数据
     * @return 更新操作影响的行数
     */
    @Update("UPDATE t_draft_base SET title = #{title}, last_save_time = NOW() " +
            "WHERE draft_id = #{draftId} AND user_id = #{userId}")
    int updateBase(DraftBasePO draftBasePO);

    /**
     * 更新草稿的内容数据
     *
     * @param draftId 草稿 id
     * @param content 草稿内容
     */
    @Update("UPDATE t_draft_content SET content = #{content} " +
            "WHERE draft_id = #{draftId}")
    void updateContent(long draftId, String content);

    /**
     * 删除指定用户的指定草稿的基础数据，如果指定草稿是指定用户保存的，则删除草稿；否则不做任何操作
     *
     * @param draftId 指定的草稿 id
     * @param userId  指定的用户 id
     * @return 删除操作影响的行数
     */
    @Delete("DELETE FROM t_draft_base WHERE draft_id = #{draftId} AND user_id = #{userId}")
    int deleteBase(long draftId, long userId);

    /**
     * 删除指定用户的指定草稿的内容数据
     *
     * @param draftId 指定的草稿 id
     */
    @Delete("DELETE FROM t_draft_content WHERE draft_id = #{draftId}")
    void deleteContent(long draftId);

    /**
     * 获取指定用户的指定草稿
     *
     * @param draftId 指定的草稿 id
     * @param userId  指定的用户 id
     * @return 如果指定草稿是指定用户保存的，则返回数据；否则返回 null
     */
    DraftPO get(long draftId, long userId);

    /**
     * 获取指定用户的草稿列表
     * <p>
     * 按照最后保存时间倒序排序
     *
     * @param userId 指定的用户 id
     * @return 指定用户的草稿列表
     */
    @Select("SELECT draft_id, title, last_save_time FROM t_draft_base " +
            "WHERE user_id = #{userId} ORDER BY last_save_time DESC")
    List<DraftSimplePO> listSimple(long userId);
}
